import { ROUTER_PATHS_PUBLIC } from '@/constants/global'
import { router } from '@/router'
import useUserInfo from '@/zustand/useUserInfo'
import type { AxiosResponse } from 'axios'
import axios from 'axios'
import toast from 'react-hot-toast'

/** 👇 自定义 axios 实例 👇 */
export const request = axios.create({
  timeout: 10000,
  headers: { 'Content-Type': ' application/json;charset=UTF-8' },
})

/** 👇 请求拦截器 👇 */
request.interceptors.request.use(
  (config) => {
    const token = useUserInfo.getState().token
    /** 👇 如果实现挤下线功能, 需要用户绑定一个 uuid, uuid 发生变化, 服务端执行相应的操作 👇 */
    if (token) config.headers!['Authorization'] = 'Bearer ' + token
    return config
  },
  (error) => {
    error.data = {}
    error.data.msg = '服务器异常, 请联系管理员 !'
    return error
  }
)

/** 👇 响应拦截器 👇 */
request.interceptors.response.use(
  (res: AxiosResponse) => {
    /** 👇 后端返回数据状态 👇 */
    const status = res.data.status || res.data.code
    if (status === 200) return res.data.data || {}
    else if (status === 401) {
      useUserInfo.getState().clear()
      toast.dismiss()
      toast.error('登录过期, 请重新登录 !')
      router.navigate(ROUTER_PATHS_PUBLIC.LOGIN)
      return Promise.reject(res.data)
    } else {
      toast.dismiss()
      toast.error(res.data.msg || '服务器偷偷跑到火星去玩了 !')
      return Promise.reject(res.data.msg || '服务器偷偷跑到火星去玩了 !')
    }
  },
  (error) => {
    /** 👇 网络错误 👇 */
    error.data = {}
    if (error?.response) {
      if (error.response.status === 400) error.data.msg = '错误请求 !'
      else if (error.response.status === 401) error.data.msg = '登录过期, 请重新登录 !'
      else if (error.response.status === 403) error.data.msg = '对不起, 您没有权限访问 !'
      else if (error.response.status === 404) error.data.msg = '请求错误, 未找到请求路径 !'
      else if (error.response.status === 405) error.data.msg = '请求方法未允许 !'
      else if (error.response.status === 408) error.data.msg = '请求超时 !'
      else if (error.response.status === 500) error.data.msg = '服务器偷懒了, 请重试 !'
      else if (error.response.status === 501) error.data.msg = '服务器不支持该请求 !'
      else if (error.response.status === 502) error.data.msg = '网络错误 !'
      else if (error.response.status === 503) error.data.msg = '服务不可用 !'
      else if (error.response.status === 504) error.data.msg = '网络超时 !'
      else if (error.response.status === 505) error.data.msg = 'http 版本不支持该请求 !'
      else error.data.msg = `连接错误 ${error.response.status} !`
    } else error.data.msg = '服务器连接失败 !'
    toast.dismiss()
    toast.error(error.data.msg)
    return Promise.reject(error)
  }
)
